package com.forum.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.forum.bean.Articles;
import com.forum.bean.Comments;
import com.forum.common.Result;
import com.forum.dto.CommentCreateRequest;
import com.forum.dto.CommentListDto;
import com.forum.mapper.ArticlesMapper;
import com.forum.mapper.CommentMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;

@Service
public class CommentService {
    @Autowired
    private CommentMapper commentMapper;

    @Autowired
    private ArticlesMapper articleMapper;


    /**
     * 写评论流程：
     * 1. 校验评论内容不为空
     * 2. 构建 Comment 实体，设置 createdAt 为当前时间
     * 3. 插入 comments 表
     * 4. （可选）更新对应文章 comment_count
     * 5. 返回插入的评论数据
     */
    @Transactional
    public Result<Comments> addComment(CommentCreateRequest req) {
        try {
            if (req.getContent() == null || req.getContent().trim().isEmpty()) {
                return Result.fail("评论内容不能为空");
            }
            if (req.getArticleId() == null || req.getUserId() == null) {
                return Result.fail("文章ID和用户ID不能为空");
            }

            // 构建 Comment 实体对象
            Comments comment = new Comments();
            comment.setArticleId(req.getArticleId());
            comment.setUserId(req.getUserId());
            comment.setContent(req.getContent());
            comment.setCreatedAt(LocalDateTime.now());

            // 插入评论表
            int rows = commentMapper.insert(comment);
            if (rows != 1) {
                return Result.fail("添加评论失败");
            }

            // 更新文章表中的评论数量：查询文章并递增 commentCount
            Articles article = articleMapper.selectById(req.getArticleId());
            if (article != null) {
                Integer count = article.getCommentCount() == null ? 0 : article.getCommentCount();
                article.setCommentCount(count + 1);
                articleMapper.updateById(article);
            }

            return Result.ok(comment);
        } catch (Exception e) {
            return Result.fail("添加评论异常：" + e.getMessage());
        }
    }


    /**
     * 删除评论流程：
     * 1. 根据评论ID查询评论记录，如果不存在则返回错误。
     * 2. 删除评论记录。
     * 3. 根据评论记录中的 articleId 更新文章表的评论计数，递减 1（确保不为负数）。
     */
    @Transactional
    public Result<String> deleteComment(Integer commentId) {
        try {
            // 查询评论记录
            Comments comment = commentMapper.selectById(commentId);
            if (comment == null) {
                return Result.fail("评论不存在");
            }

            // 删除评论
            int rows = commentMapper.deleteById(commentId);
            if (rows != 1) {
                return Result.fail("删除评论失败");
            }

            // 更新对应文章的评论计数
            Articles article = articleMapper.selectById(comment.getArticleId());
            if (article != null) {
                Integer count = article.getCommentCount() == null ? 0 : article.getCommentCount();
                // 防止负数（如果评论数已经为 0，不再递减）
                if (count > 0) {
                    article.setCommentCount(count - 1);
                    articleMapper.updateById(article);
                }
            }

            return Result.ok("删除评论成功");
        } catch(Exception e) {
            return Result.fail("删除评论异常：" + e.getMessage());
        }
    }


    /**
     * 获取指定用户的评论列表，支持分页，按时间降序排列
     * @param userId 评论者用户ID
     * @param pageNum 当前页码
     * @param pageSize 每页条数
     * @return 分页后的评论列表结果
     */
    public Result<IPage<CommentListDto>> getCommentList(Integer userId, int pageNum, int pageSize) {
        try {
            Page<CommentListDto> page = new Page<>(pageNum, pageSize);
            IPage<CommentListDto> resultPage = commentMapper.selectCommentList(page, userId);
            return Result.ok(resultPage);
        } catch (Exception e) {
            return Result.fail("查询评论列表异常：" + e.getMessage());
        }
    }
}
